 #ifndef MYDATA_H
#define MYDATA_H
/*************************************************
 *	文件名称：mydata.h
 *	文件说明：文件为线性表的基本定义，提供了
			元素的基本定义
			1.

 *	程序平台：for linux
 *	文件作者：Jason <jasonsunsoft@163.com>
 *	文件时间：
*************************************************/

#include <stdlib.h>
#include <stdio.h>
#include "../../common.h"

typedef struct {	//项的表示，多项式的项作为 LinkList 的数据元素
	float 	coef;	//系数
	int 	expn;	//指数
}term, ElemType, * pElemType;	//两个类型名：term用于本ADT，ElemType为LinkList的数据对象名

typedef struct LNode{		//结点类型
	ElemType data;			//节点数据
	struct LNode * next;	//下个节点地址
} LNode,*Link, *Position;

typedef struct {
	Link head, tail;		//分别指向线性表中的头结点和最后一个结点
	int len;				//指示线性表中数据的个数
}LinkList;

typedef LinkList polynomail;	//用带头结点的有序链表表示多项式

Status MakeNode(Link *p, ElemType e);
//初始条件:*p为Link型地址，且未指向任何对象。
//操作结果：分配由p指向的值为e的结点，并返回OK；若分配失败，则返回ERROR

void FreeNode(Link p);
// 释放p所指向的结点

Status InitList(LinkList *L);
//初始条件: L已经定义
//操作结果：构造一个空的线性表

Link GetHead(LinkList L);
//初始条件: L存在，且已经初始化
//操作结果：返回线性链表L中头结点位置

Status SetCurElem(Link p, ElemType e);
//初始条件: p存在
//操作结果：已知p指向线性链表中的一个结点，用e更新p所指结点中数据元素的值

Status LocateElem(LinkList L, ElemType e, Position *q, Status (*compare)(ElemType, ElemType));
//初始条件: 链表L存在
//操作结果：若链表L中有与e满足函数compare()判定关系，则返回TRUE，并且用q返回第一个满足关系的结点的位置，若不存在则返回FALSE，q为NULL


Status InsFirst(Link h, Link s);
//已知h指向线性链表的头结点，将s所指结点插入在第一个节点之前

Status ClearList(LinkList *L);
//将线性链表L重置为空表，并释放原链表的结点空间

Position NextPos(LinkList L, Link p);
//已知p指向线性链表L中的一个结点，返回p所指结点的直接后继位置，若无后继，则返回NULL

void GetCurElem(Link p, ElemType *e);
//已知p指向线性链表中的一个结点，用e 返回p所指结点中的元素数据的值

Status DelFirst(Link h, Link *q);
//已知h指向线性链表的头结点，删除链表中的第一个结点并以q返回

Status Append(LinkList *L, Link s);
//将指针s所指（彼此以指针相连）的一串结点链表在线性表L的最后一个结点
//之后，并改变链表L的尾指针指向新的尾结点

Position PriorPos(LinkList L, Link p);
//已知p指向线性链表L中的一个结点，返回p所指结点的直接前驱位置，若无前驱，则返回NULL

void CreatPolyn(polynomail * P, int m);
//初始条件：*p 已存在，输入为 &p， m > 0;
//操作结果：建立表示一元多项式的有序链表p，p中包含有m个非零项。

void DestroyPolyn (polynomail *p);
//初始条件：多项式表示链表p存在。
//操作结果：销毁一元多项式p

void PritPolyn(polynomail P);
//初始条件：
//操作结果：打印输出一元多项式P

int PolynLenght(polynomail P);
//初始条件：多项式表示链表P存在
//操作结果：返回一元多项式P中的项数

void AddPolyn(polynomail *Pa, polynomail *Pb);
//初始条件：多项式表示链表Pa, Pb存在
//操作结果：完成多项式的相加运算，即Pa = Pa + Pb，并销毁一元多项式Pb

void SubractPolyn(polynomail *Pa, polynomail *Pb);
//初始条件：多项式表示链表Pa, Pb存在
//操作结果：完成多项式的相减运算，即Pa = Pa - Pb，并销毁一元多项式Pb


void MultiplyPolyn(polynomail *Pa, polynomail *Pb);
//初始条件：多项式表示链表Pa, Pb存在
//操作结果：完成多项式的相乘运算，即Pa = Pa x Pb，并销毁一元多项式Pb

int cmp(term a, term b);
//初始条件：
//操作结果：依a的指数值< (或 = )(或 > ) b的指数值，分别返回 -1， 0和 +1

void CopyPolyn(polynomail Pa, polynomail * Pb);
//初始条件：多项式表示链表Pa存在，且被初始化。Pb已经定义。
//操作结果：将多项式链表Pa的内容已经各项拷贝一份，链表存在Pb中




#endif //MYDATA_H
